sound output, or to a streaming destination. Where sound is to be output, it
will select the 8 or 16 bit output depending on the normal configuration
(and availability).</p></dd></dl></dd><dd><dl><dd><p>The module has been designed so it is easy to make other frontends, or
add support for the module to existing player-frontends.</p></dd></dl></dd><dd><dl><dd><p>The AMPlayer module supports MPEG version 1, 2 and 2.5, for layers I, II
and III. Mixed data may be safely used with the module. The AMPlayer is
resilient when faced with corrupt data, and will skip unknown data in a safe
manner. Streams of data may contain ID3v2 tags, and may be terminated by
ID3v1.1 tags. ID3v2 footers are skipped and not parsed.</p></dd></dl></dd></dl><hr><dl><dt><h2><a name="section_terminology">Terminology</a></h2></dt><dd><dl><dd><p>MPEG audio data is used as a generic term, covering MPEG 1/2/2.5 audio
data, using layers I, II, or III.</p></dd></dl></dd><dd><dl><dd><p>The term VBR is used to mean 'Variable Bit-Rate'. VBR data is data which
contains non-constant bitrate through the track. It is still assumed that
the MPEG version and layer remain constant.</p></dd></dl></dd></dl><hr><dl><dt><h2><a name="section_technical_details">Technical Details</a></h2></dt><dd><dl><dd><p>In order to play MPEG audio data, AMPlayer processes data in the
background using callbacks. This allows the module to continue in, and out
of the desktop with no supervision from any other component.</p></dd></dl></dd><dt><h4><a name="subsection_mpeg_data_input_methods">MPEG data input methods</a></h4></dt><dd><dl><dd><p>MPEG audio data can come from either a file, or from a data stream. When
operating in both of these modes, the functionality of AMPlayer is similar.
<p>When streaming, an application must feed data to AMPlayer in a timely
fashion. Data is supplied to a ring of buffers which are drained
individually by the AMPlayer module. As each buffer is emptied it is the job
of the streaming application to provide further data or to close the stream.
</p>
<p>The player will take data from buffers supplied by the streaming
application in the order given. When the end of a buffer is reached, the
player will continue seamlessly to the next buffer. There is no necessity to
provide frame-aligned data to the buffers. Where frames straddle the buffer
end, it may be necessary for the player to retain the buffer until the frame
can be processed. Because of this streaming application must supply at least
two buffers and at least 2000 bytes in total for
streaming playback. When a buffer is no longer required, a service will be
issued to inform the streaming application.</p>
<p>Metadata can be supplied to the AMPlayer module during streaming. This
data will be inserted in-line with the stream and made available at the
point at which it is played. This data is incompatible with ID3v1.1 data,
and with ID3v2 data. During playback, ID3v1.1 and ID3v2 tags are skipped.
ID3v2 tags larger than the total size of the ring of buffers will cause
the player to stall.</p>
</dd></dl></dd><dt><h4><a name="subsection_file_output_methods">File output methods</a></h4></dt><dd><dl><dd><p>AMPlayer is able to output to a number of different destinations. Where
the destination is the physical sound system (8bit, 16bit or SharedSound),
the interface to the module is unchanged.</p></dd><dd><h5><b><a name="category_8_bit_sound_output">8 bit sound output</a></b></h5>
<p>All sound output is generated as 16bit-stereo data. When only the 8bit
sound system is available, a lookup table will be used by the output code
to generate the correct logarithmic output. This will result in a slight
degradation in quality, but only to the level of the system accuracy. The
overall frequency of the sound system will track that of the sound being
generated to the limits of the sound system itself. This may result in
further inaccuracies.</p>
<p>Because AMPlayer takes over the entire sound system to
handle its output, no other sounds (for example, the system beep) will be
heard in this mode. </p>
</dd><dd><h5><b><a name="category_16_bit_sound_output">16 bit sound output</a></b></h5>
<p>Where 16 bit sound is available, but SharedSound support is not, the
standard 16 bit sound drivers will be used. The overall frequency of the
sound system will track the sound being output to the limits that it is
capable.</p>
<p>In this mode, AMPlayer uses the entire 16 bit sound system. As a
consequence, no other sound will be generated whilst AMPlayer is playing.
<p>AMPlayer can be used to stream generated sound data to any other
destination through the use of the streaming output interface. In this mode,
the sound system is totally unaffected by processing performed by the
module. The streaming interface can obtain the frequency at which the data
being read should be played through this interface.
</p>
</dd></dl></dd><dt><h4><a name="subsection_multiple_instantiation">Multiple instantiation</a></h4></dt><dd><dl><dd><p>AMPlayer is able to function as a decoder for multiple clients. It
achieves this by multiple instantiation of the AMPlayer module. The
<p>*Commands will always be issued to the currently 'preferred' instance.
In general this will be the base, but under specialised circumstances
another instance may be preferred. The AMPlayer module itself will retain
the current preferred instance through all operations, and therefore the
only mechanism by which another AMPlayer instance may be the preferred is by
explicitly issuing the relevant OS_Module, or by issuing a * Command
directly to an instance.</p>
</dd></dl></dd><dt><h4><a name="subsection_data_structures">Data structures</a></h4></dt><dd><dl><dd><p>In order to communicate with AMPlayer, a number of data structures are
required. These provide information about the streams being processed.</p></dd><dt><h4><a name="subsubsection_file_information_block">File Information Block</a></h4></dt><dd>
<p>The File Information Block provides information about the file currently
<tr><td valign="top" align="right">+48</td><td valign="top" align="left">bit 4</td><td valign="top" align="left">pointer to most recent error/warning message, or 0 if no message is pending</td></tr>
<tr><td valign="top" align="right">+52</td><td valign="top" align="left">bit 5</td><td valign="top" align="left">pointer to filename of the "next" file, or 0 if no file currently queued</td></tr>
<tr><td valign="top" align="right">+60</td><td valign="top" align="left">bit 2+7</td><td valign="top" align="left">ID3v1.1 track (a number), or 0 if not specified</td></tr>
<tr><td valign="top" align="right">7</td><td valign="top">HEADERF_UNSYNCHRONISED</td><td valign="top" align="left" colspan="2">Data was unsynchronised</td></tr>
<tr><td valign="top" align="right">6</td><td valign="top">HEADERF_EXTENDEDHEADER</td><td valign="top" align="left" colspan="2">Extended header was present (ignored at present)</td></tr>
<tr><td valign="top" align="right">5</td><td valign="top">HEADERF_EXPERIMENTAL</td><td valign="top" align="left" colspan="2">Tag is experimental (should never be seen by decoder)</td></tr>
<tr><td valign="top" align="right">4</td><td valign="top">HEADERF_FOOTER</td><td valign="top" align="left" colspan="2">Footer was included (has been ignored)</td></tr>
<tr><td valign="top" align="right">other</td><td valign="top"></td><td valign="top" align="left" colspan="2">reserved, must be 0</td></tr>
</table>
</td></tr>
</table>
</p>
</dd><dt><h4><a name="subsubsection_idframe_information_block">IDFrame Information block</a></h4></dt><dd>
<p>The IDFrame Information Block is passed to the service handlers for ID3v2
processing. It provides information on the specific ID3v2 frame being
processed.
<table summary="Opaque table of offset/contents" border="0"><tr><th align="right" valign="bottom">Offset</th><th align="left" valign="bottom">Contents</th></tr>
<tr><td valign="top" align="right">+0</td><td valign="top" align="left">frame number (within this tag)</td></tr>
<tr><td valign="top" align="right">+4</td><td valign="top" align="left">frame name (0 terminated)</td></tr>
<tr><td valign="top" align="right">+12</td><td valign="top" align="left">flags for this frame :
<tr><td valign="top" align="right">0</td><td valign="top">FRAMEF_HASLENGTH</td><td valign="top" align="left" colspan="2">Length field was given</td></tr>
<tr><td valign="top" align="right">1</td><td valign="top">FRAMEF_UNSYNCHRONISED</td><td valign="top" align="left" colspan="2">Frame was unsynchronised</td></tr>
<tr><td valign="top" align="right">2</td><td valign="top">FRAMEF_ENCRYPTED</td><td valign="top" align="left" colspan="2">Frame was encrypted (N/I)</td></tr>
<tr><td valign="top" align="right">3</td><td valign="top">FRAMEF_COMPRESSED</td><td valign="top" align="left" colspan="2">Frame was compressed</td></tr>
<tr><td valign="top" align="right">6</td><td valign="top">FRAMEF_GROUP</td><td valign="top" align="left" colspan="2">Frame is one of a group</td></tr>
<tr><td valign="top" align="right">12</td><td valign="top">FRAMEF_READONLY</td><td valign="top" align="left" colspan="2">Frame should not be edited</td></tr>
<p>When starting playback, AMPlayer allocates a buffer for data from the
file. Whereas <code>AMPlayer$Buffer$*</code> determines the output
buffer size, <code>AMPlayer$FileBuffer</code> determines the input
buffer size. If you are accessing files on a filing system which has a
slow start up time, (for example networks or CDs) you may wish to set this
higher value than the default.</p>
<p>The value this variable is set to is in Kilobytes. Unlike the output
buffer, the input cannot be measured in blocks because that would require
knowing in advance the data contained in the blocks.</p>
<p>For Streams <code>AMPlayer$FileBuffer</code> has no meaning and is
not used.</p>
</dd></dd></dl></dd><dd><dl><dd><hr><h2 align="right"><a name="sysvar_amplayer_volume">AMPlayer$Volume</a></h2><dd>Volume level to use when AMPlayer starts</dd><dt><h5>Use</h5></dt><dd>
<p>When AMPlayer initialises, it reads <code>AMPlayer$Volume</code> to
determine the initial volume. This is a linear volume level, with a maximum
at 127, a minimum at 0, and a default level of 112.</p>
<p>Whenever the volume level is changed in the base instance, this system
variable is updated to reflect this. When an instance starts (in the same
manner as the base AMPlayer instantiation intialising), it reads the state
of <code>AMPlayer$Volume</code> and sets its volume to that specified.
The result of this is that at any time that an instance is created it starts
with the same volume level as the base instance. Should an instance wish
to control the volume level of its instance, it should do so with care and
pay attention to the initial volume level where appropriate. For example,
if the user is playing their base instance at a volume level of 12, they
will not wish to have a new instance playing at 112 unless they specifically
requested it.</p>
</dd><dt><h5>Related SWIs</h5></dt><dd><a href="#swi_amplayer_control-1">AMPlayer_Control 1</a></dd></dd></dl></dd><dd><dl><dd><hr><h2 align="right"><a name="sysvar_amplayer_decimationthreshold">AMPlayer$DecimationThreshold</a></h2><dd>Select decimation threshold to use when AMPlayer starts</dd><dt><h5>Use</h5></dt><dd>
<p>When AMPlayer initialises, it reads
<code>AMPlayer$DecimationThreshold</code> to determine the initial
decimation threshold. This threshold is used to determine during playback
whether decimation of input data is used to provide output data.</p>
<p>Whenever the decimation threshold is changed in the base instance, this
system variable is updated to reflect this. When an instance starts (in the
same manner as the base AMPlayer instantiation intialising), it reads the
state of <code>AMPlayer$DecimationThreshold</code> and sets its
threshold to that specified. The result of this is that at any time that an
instance is created it starts with the same threshold as the base
instance.</p>
<p>When decimating input data, the upper half of the frequency data is
discarded, resulting in a frequency of half that normally required for
the input data. This reduces the processing required by the data, and
therefore reduces the load that AMPlayer places on the system. This speed
increase is to the detriment of the quality of the output data.</p>
(<acronym>Service &52E00</acronym>)</h2><dd>Events issued by AMPlayer</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to Service call" border="0">
(<acronym>Service &52E00</acronym>)</h2><dd>AMPlayer module is initialising</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to Service call" border="0">
(<acronym>Service &52E00</acronym>)</h2><dd>AMPlayer module is dying</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to Service call" border="0">
(<acronym>Service &52E00</acronym>)</h2><dd>Playback is about to start</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to Service call" border="0">
(<acronym>Service &52E00</acronym>)</h2><dd>Playback has stopped</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to Service call" border="0">
(<acronym>Service &52E00</acronym>)</h2><dd>Playback has moved on to another track</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to Service call" border="0">
(<acronym>Service &52E00</acronym>)</h2><dd>ID3v2 tag has been found</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to Service call" border="0">
(<acronym>Service &52E00</acronym>)</h2><dd>One or more buffers previously passed to an AMPlayer have been marked as free</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to Service call" border="0">
(<acronym>SWI &52E00</acronym>)</h2><dd>Plays or queues a file</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
<tr><td valign="top" align="right">0</td><td valign="top">Queue</td><td valign="top" align="left" colspan="2">Places the named file in the queue of tracks
to play. If there is no file currently
playing, the behaviour is exactly as if bit
0 were clear.</td></tr>
<tr><td valign="top" align="right">1</td><td valign="top">Cue</td><td valign="top" align="left" colspan="2">Starts the named file immediately, but paused
<tr><td valign="top" align="right">3-30</td><td valign="top"></td><td valign="top" align="left" colspan="2">Reserved, must be 0.</td></tr>
<tr><td valign="top" align="right">31</td><td valign="top"></td><td valign="top" align="left" colspan="2">R8 contains the instance handle to which this call
should be directed.</td></tr>
</table>
</td></tr>
<tr><td valign="top" align="right">R1</td><td valign="top">=</td><td valign="top" align="left">pointer to filename</td></tr>
<tr><td valign="top" align="right">R2</td><td valign="top">=</td><td valign="top" align="left">if bit 2 of R0 set:<br>
volume level to set, or -1 for default
</td></tr>
<tr><td valign="top" align="right">R3</td><td valign="top">=</td><td valign="top" align="left">if bit 2 of R0 set:<br>
pointer to instance name, or 0 to name
automatically
</td></tr>
<tr><td valign="top" align="right">R8</td><td valign="top">=</td><td valign="top" align="left">if bit 31 of R0 set:<br>
instance handle to direct at, or 0 for
the base</td></tr>
</table></dd><dt><h5>On exit</h5></dt><dd><table summary="Conditions on exit from SWI" border="0">
<tr><td valign="top" align="right">R0</td><td valign="top">=</td><td valign="top" align="left">if bit 2 of R0 set:<br>
handle of created instance
</td></tr>
</table></dd><dt><h5>Interrupts</h5></dt><dd>Interrupts are undefined<br>
Fast interrupts are enabled</dd><dt><h5>Processor mode</h5></dt><dd>Processor is in SVC mode
</dd><dt><h5>Re-entrancy</h5></dt><dd>SWI is not re-entrant</dd><dt><h5>Use</h5></dt><dd>
<p>This SWI is used to play or queue a file for playback. When starting
play transiently, the current play is unchaged and only the new instance
Playback continues with the queued file if any. If no file is queued,
playback will stop.</td></tr>
<tr><td valign="top" align="right">1-30</td><td valign="top"></td><td valign="top" align="left" colspan="2">Reserved, must be 0.</td></tr>
<tr><td valign="top" align="right">31</td><td valign="top"></td><td valign="top" align="left" colspan="2">R8 contains the instance handle to which this call
should be directed.</td></tr>
</table>
</td></tr>
<tr><td valign="top" align="right">R8</td><td valign="top">=</td><td valign="top" align="left">if bit 31 of R0 set:<br>
instance handle to direct at, or 0 for
the base</td></tr>
</table></dd><dt><h5>On exit</h5></dt><dd>None</dd><dt><h5>Interrupts</h5></dt><dd>Interrupts are undefined<br>
Fast interrupts are enabled</dd><dt><h5>Processor mode</h5></dt><dd>Processor is in SVC mode
</dd><dt><h5>Re-entrancy</h5></dt><dd>SWI is not re-entrant</dd><dt><h5>Use</h5></dt><dd>
<p>This SWI is used to stop playback, or start the skip to the queued
<tr><td valign="top" align="right">1-30</td><td valign="top"></td><td valign="top" align="left" colspan="2">Reserved, must be 0.</td></tr>
<tr><td valign="top" align="right">31</td><td valign="top"></td><td valign="top" align="left" colspan="2">R8 contains the instance handle to which this call
should be directed.</td></tr>
</table>
</td></tr>
<tr><td valign="top" align="right">R8</td><td valign="top">=</td><td valign="top" align="left">if bit 31 of R0 set:<br>
instance handle to direct at, or 0 for
the base</td></tr>
</table></dd><dt><h5>On exit</h5></dt><dd>None</dd><dt><h5>Interrupts</h5></dt><dd>Interrupts are undefined<br>
Fast interrupts are enabled</dd><dt><h5>Processor mode</h5></dt><dd>Processor is in SVC mode
</dd><dt><h5>Re-entrancy</h5></dt><dd>SWI is not re-entrant</dd><dt><h5>Use</h5></dt><dd>
<p>This SWI is used to pause or resume playback. When paused, decoding to
the output buffer continues, but at a much reduced rate. There is no sound
output.</p>
<p>Pause mode may also be cancelled by stopping. If
<a href="#swi_amplayer_stop">AMPlayer_Stop</a> is used to
cut to the next file, or if a different file is started, pause mode will
continue to be in effect, freezing the new file at the start of the file.
This can be used to ensure that playback starts at the instant of calling
AMPlayer_Pause (as opposed to calling
<a href="#swi_amplayer_play">AMPlayer_Play</a>, which can have a delay while
(<acronym>SWI &52E03</acronym>)</h2><dd>Locates a position in the playback</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E04</acronym>)</h2><dd>Return information on the state of playback</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
</table></dd><dt><h5>Interrupts</h5></dt><dd>Interrupts are undefined<br>
Fast interrupts are enabled</dd><dt><h5>Processor mode</h5></dt><dd>Processor is in SVC mode
</dd><dt><h5>Re-entrancy</h5></dt><dd>SWI is not re-entrant</dd><dt><h5>Use</h5></dt><dd>
<p>This call will return information about the current state of the
player.</p>
<p>When locating, the current time can be read from the file info block, as
it moves toward the target time returned in R4.</p>
<p>This call might be made from BASIC with :</p>
<p>
<tt><b>SYS "AMPlayer_Info",,"" TO ,Filename$,FIB%</b></tt>
</p>
<p>This will set Filename$ to either "" or the filename. Similarily, FIB%
will be 0 if there is no info at this stage, or a pointer to it if there
is.</p>
<p>There is a brief period when the status might be returned as Locating (2) or Playing (3), but where there is no valid FIB, because the first frame has yet to be read.</p>
(<acronym>SWI &52E05</acronym>)</h2><dd>Configure the operation of the player</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E05</acronym>)</h2><dd>Read or write the volume level</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E05</acronym>)</h2><dd>Read or write the output buffer size</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E05</acronym>)</h2><dd>Control the ID3v2 tag processing facilities</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E05</acronym>)</h2><dd>Enable or disable ID3v2 processing</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E05</acronym>)</h2><dd>Read or write the 'transience' flag</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E05</acronym>)</h2><dd>Read or write the decimation threshold</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
<tr><td valign="top" align="right">R2</td><td valign="top">=</td><td valign="top" align="left">private word to pass in R0</td></tr>
<tr><td valign="top" align="right">R3</td><td valign="top">=</td><td valign="top" align="left">pointer to <a href="#entry_plugin_preprocess">pre-processor (pre-DCT)</a>, or 0 for none
</td></tr>
<tr><td valign="top" align="right">R4</td><td valign="top">=</td><td valign="top" align="left">pointer to <a href="#entry_plugin_postprocess">post-processor (post-DCT)</a>, or 0 for
none</td></tr>
<tr><td valign="top" align="right">R5</td><td valign="top">=</td><td valign="top" align="left">pointer to static
<a href="#subsubsection_plugin_information_block">Plugin Information Block</a>
</td></tr>
<tr><td valign="top" align="right">R8</td><td valign="top">=</td><td valign="top" align="left">if bit 31 of R0 set:<br>
instance handle to direct at, or 0 for
the base</td></tr>
</table></dd><dt><h5>On exit</h5></dt><dd>None</dd><dt><h5>Interrupts</h5></dt><dd>Interrupts are undefined<br>
Fast interrupts are enabled</dd><dt><h5>Processor mode</h5></dt><dd>Processor is in SVC mode
</dd><dt><h5>Re-entrancy</h5></dt><dd>SWI is not re-entrant</dd><dt><h5>Use</h5></dt><dd>
<p>This SWI is used to register or deregister plugins.</p>
(<acronym>SWI &52E07</acronym>)</h2><dd>Return information on the a file</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
<tr><td valign="top" align="right">R0</td><td valign="top">=</td><td valign="top" align="left">flags for requested information, or 0 to return
(<acronym>SWI &52E08</acronym>)</h2><dd>Starts a stream playing</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
<tr><td valign="top" align="right">0</td><td valign="top">Queue</td><td valign="top" align="left" colspan="2">Places the named file in the queue of tracks
to play. If there is no file currently
playing, the behaviour is exactly as if bit
0 were clear.</td></tr>
<tr><td valign="top" align="right">1</td><td valign="top">Cue</td><td valign="top" align="left" colspan="2">Starts the named file immediately, but paused
at the first frame. Use
<a href="#swi_amplayer_pause">AMPlayer_Pause</a>
to start playback.</td></tr>
<tr><td valign="top" align="right">2</td><td valign="top">GenerateService</td><td valign="top" align="left" colspan="2">Indicates that
<tr><td valign="top" align="right">3-30</td><td valign="top"></td><td valign="top" align="left" colspan="2">Reserved, must be 0.</td></tr>
<tr><td valign="top" align="right">31</td><td valign="top"></td><td valign="top" align="left" colspan="2">R8 contains the instance handle to which this call
should be directed.</td></tr>
</table>
</td></tr>
<tr><td valign="top" align="right">R1</td><td valign="top">=</td><td valign="top" align="left">pointer to stream name (for information)
</td></tr>
<tr><td valign="top" align="right">R8</td><td valign="top">=</td><td valign="top" align="left">if bit 31 of R0 set:<br>
instance handle to direct at, or 0 for
the base</td></tr>
</table></dd><dt><h5>On exit</h5></dt><dd><table summary="Conditions on exit from SWI" border="0">
<tr><td valign="top" align="right">R0</td><td valign="top">=</td><td valign="top" align="left">stream handle, or 0 if failed to
start</td></tr>
</table></dd><dt><h5>Interrupts</h5></dt><dd>Interrupts are undefined<br>
Fast interrupts are enabled</dd><dt><h5>Processor mode</h5></dt><dd>Processor is in SVC mode
</dd><dt><h5>Re-entrancy</h5></dt><dd>SWI is not re-entrant</dd><dt><h5>Use</h5></dt><dd>
<p>This SWI is used to start streamed input, ready for playback.</p>
<p>Called by a streaming application to get a Stream Handle.
Most streamers will start the stream paused and feed data in until the
buffer full flag (see <a href="#swi_amplayer_streaminfo">AMPlayer_StreamInfo</a>)
is set.</p>
<p>Note: The combination of Queue and Start Paused may not work.</p>
(<acronym>SWI &52E09</acronym>)</h2><dd>Informs AMPlayer that a stream has ended</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E0A</acronym>)</h2><dd>Inform AMPlayer of the location of input data</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E0B</acronym>)</h2><dd>Read information about the streaming data</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E0C</acronym>)</h2><dd>Read meta-data state value</dd><dt><h5>On entry</h5></dt><dd>None</dd><dt><h5>On exit</h5></dt><dd><table summary="Conditions on exit from SWI" border="0">
(<acronym>SWI &52E0E</acronym>)</h2><dd>Read sound systems available, or set output sound system</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E0F</acronym>)</h2><dd>Read data from streaming sound system</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E10</acronym>)</h2><dd>Read current instance handle</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E10</acronym>)</h2><dd>Create a new instance of the module</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E10</acronym>)</h2><dd>Destroy an instance of the module</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
(<acronym>SWI &52E10</acronym>)</h2><dd><p>This SWI call is for internal use only. You must not use it in your
own code.</p></dd></dd></dl></dd><dd><dl><dd><hr><h2 align="right"><a name="swi_amplayer_instance-4">AMPlayer_Instance 4</a><br>
(<acronym>SWI &52E10</acronym>)</h2><dd>Enumerate handles of known instances</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to SWI" border="0">
</table></dd><dt><h5>On exit</h5></dt><dd><table summary="Conditions on exit from entry-point" border="0">
<tr><td valign="top" align="right">R0</td><td valign="top">=</td><td valign="top" align="left">0 if frequencies processed<br>
1 if DCTs done (not recommended)
</td></tr>
</table></dd><dt><h5>Interrupts</h5></dt><dd>Interrupts are disabled<br>
Fast interrupts are enabled</dd><dt><h5>Processor mode</h5></dt><dd>Processor is in SVC mode
</dd><dt><h5>Re-entrancy</h5></dt><dd>Entry-point is not re-entrant</dd><dt><h5>Use</h5></dt><dd>
<p>This entry is called prior to 'dct64' which decodes the frequencies into the buffer. Note that there is no way in which to identify whether the buffer is for the left or right channel.</p>
</dd><dt><h5>Related APIs</h5></dt><dd>None</dd></dd></dl></dd><dd><dl><dd><hr><h2 align="right"><a name="entry_plugin_postprocess">Plugin_PostProcess</a></h2><dd>Post-process DCT output buffers</dd><dt><h5>On entry</h5></dt><dd><table summary="Conditions on entry to entry-point" border="0">
<tr><td valign="top" align="right">R1</td><td valign="top">=</td><td valign="top" align="left">pointer to 'out 1' buffer</td></tr>
<tr><td valign="top" align="right">R2</td><td valign="top">=</td><td valign="top" align="left">pointer to 'out 2' buffer</td></tr>
<tr><td valign="top" align="right">R3</td><td valign="top">=</td><td valign="top" align="left">pointer to samples buffer</td></tr>
</table></dd><dt><h5>On exit</h5></dt><dd><table summary="Conditions on exit from entry-point" border="0">
<tr><td valign="top" align="right">R0</td><td valign="top">=</td><td valign="top" align="left">0 if buffer processed
</td></tr>
</table></dd><dt><h5>Interrupts</h5></dt><dd>Interrupts are disabled<br>
Fast interrupts are enabled</dd><dt><h5>Processor mode</h5></dt><dd>Processor is in SVC mode
</dd><dt><h5>Re-entrancy</h5></dt><dd>Entry-point is not re-entrant</dd><dt><h5>Use</h5></dt><dd>
<p>This entry is called after the 'dct64' which decodes the frequencies into
the buffer. Note that there is no way in which to identify whether the
buffer is for the left or right channel. </p>
</dd><dt><h5>Related APIs</h5></dt><dd>None</dd></dd></dl></dd></dl><hr><dl><dt><h2><a name="section_commands">*Commands</a></h2></dt><dd><dl><dd><hr><h2 align="right"><a name="command_aminfo">*AMInfo</a></h2><dd>Read information on playback, plugins or file</dd><dt><h5>Syntax</h5></dt><dd><code>*AMInfo
</dd><dt><h5>Related SWIs</h5></dt><dd><a href="#swi_amplayer_info">AMPlayer_Info</a>, <a href="#swi_amplayer_fileinfo">AMPlayer_FileInfo</a>, <a href="#swi_amplayer_plugin">AMPlayer_Plugin</a></dd></dd></dl></dd><dd><dl><dd><hr><h2 align="right"><a name="command_amlocate">*AMLocate</a></h2><dd>Skip to a position in the current file</dd><dt><h5>Syntax</h5></dt><dd><code>*AMLocate
[+ | -]
<i><hours></i>:<i><minutes></i>:<i><seconds></i>
</code><br><code>*AMLocate
<i><minutes></i>:<i><seconds></i>
</code></dd><dt><h5>Parameters</h5></dt><dd><table summary="Command parameters" border="0"><tr><td valign="top"><code><i><hours></i></code></td><td valign="top">-</td><td valign="top">Number of hours to search for</td></tr><tr><td valign="top"><code><i><minutes></i></code></td><td valign="top">-</td><td valign="top">Number of minutes to search for</td></tr><tr><td valign="top"><code><i><seconds></i></code></td><td valign="top">-</td><td valign="top">Number of seconds to search for</td></tr></table></dd><dt><h5>Use</h5></dt><dd>
<p>This command is used to jump to a point in the playback of the file. Use
+ and - to indicate a location relative to the current playback position.
</p>
</dd><dt><h5>Example</h5></dt><dd>
<code>*AMLocate 7:23</code>
</dd><dt><h5>Related SWIs</h5></dt><dd><a href="#swi_amplayer_locate">AMPlayer_Locate</a></dd></dd></dl></dd><dd><dl><dd><hr><h2 align="right"><a name="command_ampause">*AMPause</a></h2><dd>Pause, or resume, playback</dd><dt><h5>Syntax</h5></dt><dd><code>*AMPause
-off </code></td><td valign="top">-</td><td valign="top">resume playback, instead of pausing</td></tr></table></dd><dt><h5>Use</h5></dt><dd>
<p>This command is used to pause, or resume playback.</p>
</dd><dt><h5>Example</h5></dt><dd>
<code>*AMPause</code>
</dd><dt><h5>Related SWIs</h5></dt><dd><a href="#swi_amplayer_pause">AMPlayer_Pause</a></dd></dd></dl></dd><dd><dl><dd><hr><h2 align="right"><a name="command_amplay">*AMPlay</a></h2><dd>Play a new file</dd><dt><h5>Syntax</h5></dt><dd><code>*AMPlay